<script setup lang="ts">
import { ref,watch,watchEffect } from "vue";
import type { Ref } from 'vue';


const price=ref(100)

// 第一个参数是侦听器的源。这个来源可以是以下几种：
// 一个函数，返回一个值
// 一个 ref
// 一个响应式对象
// ...或是由以上类型的值组成的数组

// 第二个参数是在发生变化时要调用的回调函数，这个回调函数接受三个参数：新值、旧值，以及一个用于注册副作用清理的回调函数。
const stop=watch (price,(newvalue,value)=>{

  //flush
  console.log(document.querySelector('h1')?.innerText);
  


  /*
immediate：在侦听器创建时立即触发回调。第一次调用时旧值是 undefined。
deep：如果源是对象，强制深度遍历，以便在深层级变更时触发回调。参考深层侦听器。
flush：调整回调函数的刷新时机。参考回调的刷新时机及 watchEffect()。
onTrack / onTrigger：调试侦听器的依赖。参考调试侦听器。
once：回调函数只会运行一次。侦听器将在回调函数首次运行后自动停止。  */
},{
  immediate:true,
  //深度监听极度消耗性能
  deep:true,
  flush:'post',
  once:true
})
 
// 停止侦听器
stop()


// 当侦听器侦听多个值时,通过配置数组监听多个值
const name=ref("张三")

watch([price,name],(newvalue,value)=>{
  console.log(newvalue,value);
  
})


// watchEffect
watchEffect(()=>{
  console.log(price.value);
  
})
</script>



<template>
  <h1>price:{{ price }}</h1>
  <button @click="price++">点击修改price</button>
</template>